package sicnu.cs.ich.security.util;

import java.util.Map;
import java.util.Random;
import java.util.regex.Pattern;

/**
 * 参数校验
 *
 * @author 沈洋 邮箱:1845973183@qq.com
 * @create 2021/10/31-16:54
 **/
public class ValidateUtils {
    /**
     * 校验map
     *
     * @param params 参数Map
     * @param keys   要校验的键值
     * @return 是否包含全部键值对
     * 缺失参数时返回false
     * 包含全部参数，则返回true，
     */
    public static boolean isValidStrParams(Map<String, String> params, String... keys) {
        for (String s : keys) {
            if (!params.containsKey(s)) return false;
        }
        return true;
    }

    /**
     * 校验map
     *
     * @param params 参数Map
     * @param keys   要校验的键值
     * @return 是否包含全部键值对
     * 缺失参数时返回false
     * 包含全部参数，则返回true，
     */
    public static boolean isValidParams(Map<String, Object> params, String... keys) {
        for (String s : keys) {
            if (!params.containsKey(s)) return false;
        }
        return true;
    }

    /**
     * 创建指定长度的验证码
     *
     * @param length 验证码长度
     * @return 验证码
     */
    public static String createValidateCode(int length) {
        Random random = new Random();
        StringBuilder code = new StringBuilder();
        char[] chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        for (int i = 0; i < length; i++) {
            code.append(chars[random.nextInt(chars.length)]);
        }
        return code.toString();
    }

    /**
     * 创建六位验证码
     *
     * @return 验证码
     */
    public static String createValidateCode() {
        return createValidateCode(6);
    }

    /**
     * 校验邮箱格式是否正确
     *
     * @param email 邮箱
     * @return 合法-true 不合法-false
     */
    public static boolean isValidEmail(String email) {
        if ((email != null) && (!email.isEmpty())) {
            return Pattern.matches("^(\\w+([-.][A-Za-z0-9]+)*){3,18}@\\w+([-.][A-Za-z0-9]+)*\\.\\w+([-.][A-Za-z0-9]+)*$", email);
        }
        return false;
    }

    /**
     * 校验密码符合规则
     * 规则：密码长度6-12 密码中必须包含 字母和数字
     *
     * @param password 密码
     * @return 返回是否合法
     */
    public static boolean isValidPassword(String password) {
        boolean isDigit = false;//定义一个boolean值，用来表示是否包含数字
        boolean isLetter = false;//定义一个boolean值，用来表示是否包含字母
        for (int i = 0; i < password.length(); i++) {
            if (Character.isDigit(password.charAt(i))) {   //用char包装类中的判断数字的方法判断每一个字符
                isDigit = true;
            } else if (Character.isLetter(password.charAt(i))) {  //用char包装类中的判断字母的方法判断每一个字符
                isLetter = true;
            }
        }
        String regex = "^[a-zA-Z0-9]{6,12}$";
        return isDigit && isLetter && password.matches(regex);
    }
}
